#include"block.h"

//0-8         -----      该块周围雷数（未翻开）   X
//50-58       -----      该块有红旗。             X+50
//100-108     -----      该块周围雷数（已翻开）   X+100
//99          -----      该块为雷
//149         -----      该块为雷且有红旗
//简单来说即每个雷块存储一个0-8范围内的数设为X，
//当其被标记上红旗时，将其加上50，即为X+50，若其被挖掘，则将其加上100，即为X+100.
//若其为雷，则其内数为99，标上红旗则加上50，即为149.


block::block(int row ,int col,int boomNum){
    p=new int *[row];
    for(int i=0;i<row;i++){
        p[i]=new int [col];
        for(int j=0;j<col;j++){
            p[i][j]=0;//先将所有格子赋值为0
        }
    }


    srand((unsigned)time(0));//产生随机炸弹，并将其赋值为99
    for(int i=0;i<boomNum;i++){
        int boomrow=rand()%row,boomcol=rand()%col;
        if(p[boomrow][boomcol]==0){
            p[boomrow][boomcol]=99;
        }
        else{
            i--;
        }
    }

    for(int i=0;i<row;i++){//为非炸弹格子赋值，值为周围炸弹个数
        for(int j=0;j<col;j++){

            if(p[i][j]!=99){
                for(int k=i-1;k<=i+1;k++){
                    for(int l=j-1;l<=j+1;l++){
                        if(k>=0&&k<row&&l>=0&&l<col&&p[k][l]==99)//处理特殊情况
                            p[i][j]++;
                    }
                }
            }
        }
    }

    //为类里的私有变量赋初值
    this->row = row;
    this->col = col;
    this->boomNum = boomNum;
    this->redFlagNum = boomNum;
}

int block::getcol()
{
    return this->col;
}
int block::getrow()
{
    return this->row;
}
int block::getboomNum()
{
    return boomNum;
}
int block::getredFlagNum()
{
    return redFlagNum;
}
void block::minusredFlagNum()//拔旗
{
    redFlagNum = redFlagNum -1;
}
void block::addredFlagNum()//插旗
{
     redFlagNum = redFlagNum + 1;
}
